#pragma once
#include <iostream>
#include <algorithm>
#include <cstring>
#include <assert.h>

using namespace std;

class Date
{
	//友元函数声明  可以访问内部成员
	friend ostream& operator<<(ostream& out, const Date& d);
	friend istream& operator>>(istream& in, Date& d);
public:
	//构造函数
	//全缺省的声明和定义要分离
	Date(int year = 2024, int month = 4, int day = 14);

	// 直接定义类里面，他默认是inline
	// 频繁调用
	int getmonthday(int year, int month)
	{
		assert(month > 0 && month < 13);

		static int monthDayArray[13] = { -1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

		// 365天 5h +
		if (month == 2 && (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
		{
			return 29;
		}
		else
		{
			return monthDayArray[month];
		}
	}

	bool operator>(const Date& d) const;
	bool operator>=(const Date& d) const;
	bool operator<(const Date& d) const;
	bool operator<=(const Date& d) const;
	bool operator==(const Date& d) const;
	bool operator!=(const Date& d) const;
	Date& operator+=(const int day);
	Date operator+(const int day) const;
	Date& operator-=(const int day);
	Date operator-(const int day) const;

	//前置++
	Date& operator++();

	//为了区分 构成重载 给后置++强行的增加了一个int形参
	//这里不需要写形参名， 因为接收值是多少不重要 也不需要用
	//仅仅是为了跟前置++构成重载进行区分
	Date operator++(int);

	Date& operator--();
	Date operator--(int);

	int operator-(const Date& d) const;

	//流插入 不建议写成成员函数
	//因为Date* this占据了第一个参数的位置 使用d << cout 不符合规范
	//void operator<<(ostream& out);


	//const函数问题  修饰的是 Date* this
	//const Date* const this  双const
	void Print() const;

private:
	int _year;
	int _month;
	int _day;
};

//重载
ostream& operator<<(ostream& out, const Date& d);

istream& operator>>(istream& in, Date& d);




